package com.demo.java.OD101_150.OD118;

import java.util.Scanner;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【整型数组按个位值排序】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/145699856
 */
public class OdMain {

    // 该方法用于根据整数数组中的每个数的个位值对数组进行分组和排序
    private static void solve(String[] values) {
        // 创建一个 HashMap 来存储每个数字的个位值（0到9）对应的数字列表
        Map<Integer, List<Integer>> myHashMap = new HashMap<>();

        // 遍历输入的字符串数组，逐个处理每个值
        for (int j = 0; j < values.length; ++j) {
            // 将字符串转换为整数并获取其绝对值
            int absValue = Math.abs(Integer.parseInt(values[j]));
            // 计算该数字的个位数，即 absValue % 10
            int resValue = absValue % 10;

            // 从 HashMap 中获取该个位值对应的列表，如果没有该 key 则创建一个新的 ArrayList
            List<Integer> myList = myHashMap.getOrDefault(resValue, new ArrayList<>());

            // 将当前数字加入到对应的个位数列表中
            myList.add(Integer.parseInt(values[j]));

            // 将更新后的列表放回 HashMap 中
            myHashMap.put(resValue, myList);
        }

        // 使用 StringBuilder 来构建输出字符串
        StringBuilder builder = new StringBuilder();

        // 遍历 0 到 9 的每个数字（即个位值）
        for (int i = 0; i <= 9; ++i) {
            // 获取 HashMap 中对应个位值 i 的数字列表
            List<Integer> myList = myHashMap.get(i);

            // 如果该个位值对应的列表不为空
            if (myList != null && myList.size() > 0) {
                // 遍历列表，将数字按顺序添加到结果字符串中
                for (int j = 0; j < myList.size(); ++j) {
                    builder.append(myList.get(j)).append(","); // 每个数字后面加上逗号
                }
            }
        }

        // 删除结果字符串最后多余的逗号
        builder.deleteCharAt(builder.length() - 1);

        // 输出构建好的字符串
        System.out.println(builder);
    }

    public static void main(String[] args) {
        try {
            // 创建 Scanner 对象用于获取用户输入
            Scanner scan = new Scanner(System.in);

            // 获取输入的字符串并按逗号分割成字符串数组
            String[] values = scan.nextLine().split(",");

            // 检查输入字符串数组的长度是否合法（应在 1 到 1000 个元素之间）
            if (values.length < 1 || values.length > 1000) {
                System.out.println("input error");
                return;
            }

            // 调用 solve 方法处理输入并输出结果
            solve(values);
        } catch (Exception e) {
            // 如果发生异常，打印堆栈信息并输出错误提示
            e.printStackTrace();
            System.out.println("input error");
        }
    }
}
